package main

import (
	"fmt"
	"reflect"
	"time"
)

func main() {
	reflectTest()
}
func reflectTest(o interface{}) error {
	re := reflect.TypeOf(o).Elem()
	rv := reflect.ValueOf(o).Elem()
	//判断是否为结构体
	if re.Kind() == reflect.Struct {
		for i := 0; i < re.NumField(); i++ {
			f := re.Field(i)
			name := f.Name
			fmt.Printf("field name %v :", name)
			//获取结构体其中一个字段的值
			v := rv.FieldByName(name)
			if v.Kind() == reflect.Struct {
				//处理时间类型
				if v.Type().ConvertibleTo(reflect.TypeOf(time.Time{})) {
					fmt.Printf("field name : %v type of time", name)
					continue
				}
				//判断是否为空
				if !v.IsNil() {
					fmt.Printf("field name : %v is empty", name)
					continue
				}
				//TODO 此处没有业务逻辑可以补充
			}
			//处理数组类型
			if v.Kind() == reflect.Slice {
				for j := 0; j < v.Len(); j++ {
					//判断数组里面的对象是否为指针类型
					if reflect.TypeOf(v.Index(j).Interface()).Kind() == reflect.Ptr {
						fmt.Printf("field name : %v type of Ptr", name)
						continue
					}
				}
			}

		}
	}
	return nil
}
